home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / PASCAL / ALLSWAGS.ZIP / SWAGG-M.ZIP / MISC.SWG / 0132_BASM Bug.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1995-05-26  |  4.9 KB  |  155 lines

  1.  
  2. { Updated MISC.SWG on May 26, 1995 }
  3.  
  4. {
  5. To let every one know that mite have had some bad experience with Assembler
  6. using the Basm I have found a Major bug in TP 6.0 and still exist in TP 7.0 !
  7. with the BASM you are allowed to use @Data, @Code ect.. Well i found out
  8. this ! if you do this
  9.  
  10.   asm
  11.     mov Ax, Word ptr @Data;
  12.   end;
  13.  
  14. which isn't really the correct way to use it but was the only way i could
  15. think at the time i was pounding in the code because my fall fledged
  16. assemblers let  me do this since it knows how to handle it properly an
  17. produce the correct code..  Well in the BASM it also lets you do this with
  18. no complaint from the compiler !, Well guess what? after examining the code
  19. with Debug i found two things. one is that line of code that did that never
  20. got generate in the finale EXE, the compiler just though it was ok to leave
  21. out the whole line?  Secondly i did this in a UNIT and when any call in side
  22. this unit made any call to another function or procedure in the same unit it
  23. would generate a Near call which is fine because that is what tp does for
  24. optimizing but guess what?, the address reference it makes is so far out
  25. of range it produces a QEMM error over here but if a call is made to this
  26. same function or procedure from the Main modual the correct address is
  27. generated  because it uses the Far call to do so..
  28.  
  29. Example
  30. }
  31.  
  32. Unit Test;
  33. Interface
  34.  procedure one;
  35.  procedure two;
  36. implementation
  37.  procedure one;
  38.   begin
  39.     asm
  40.        mov ax, Word Ptr @Data;
  41.     End;
  42.    End;
  43.  procedure two;
  44.   begin
  45.     one; { call number one }
  46.     Writeln(' hello, Testing ');
  47.   End;
  48. End.
  49. {
  50.  
  51. When examining this with Debug i found that pro Two did this
  52.  
  53.   Push CS;
  54.   Call Near One;  But mind you the address here
  55.  
  56.   Was not pointing to "ONE", but pointing to some far out of site
  57.  locations to garbage code..
  58. < ------ Main Modual ---->
  59. }
  60. Uses Test;
  61. Begin
  62.   One;
  63.   Two;
  64. End;
  65.  
  66. {
  67. Now in this one when view with Debug the One & Two Calls are correct
  68. in its addresses, but the calls with in the UNIT to another
  69. neighboring block of code is optimized to a Near and the wrong address
  70. is generated to does not point to anything that comforms..
  71.  
  72.  Now after aprox. four hours testing and Debug i found this..
  73.  
  74. Change the Line where i had the Mov AX, Word Ptr @Data to
  75. Mov Ax, Seg @Data and all is ok, this line does finally end up in the
  76. EXE and the Near call Addressing with in the same UNit also now works.
  77.  
  78.  Now keep in mind TP does not generate an Compiler error to halt the
  79. compiling process of any type.!!!!!!!!!! no matter what the switches
  80. are set but rather it des to corrupt the enviroment of TO while
  81. it is compiling..
  82.   I relized that using the @data as i did is not the intended way to
  83.  use the this compiler directive for the BASM but since i am use to
  84. do ing this in a Fall blown assembler and it knows what i want and
  85. generates same results i am looking i just expect that TP would give
  86. me a Syntax error of some kind, so lets say it don't, then way is it
  87. messing up the compiler for Near calls then ?, shouldn't be doing that!
  88.  
  89.  I also know about anther Bug in Basm i found way back..
  90. You can not perform a direct Absolute COnstant Far call Address.
  91.  Call $FFFF:0000; for example will not generate what you want but will
  92. point you to some area of the Data segment!.
  93.    Even if use a const it will also generate the same results...
  94. P.S.
  95.    These serious errors in the compiler still exist in the TP 7.0 and
  96.  the BP 7.0 protect mode...
  97.  
  98.  
  99. --------------------------------
  100.  
  101.   From: Dj Murdoch
  102.  
  103. >   asm
  104. >     mov Ax, Word ptr @Data;
  105. >   end;
  106.  
  107. This might be related to another bug in TP/BP 7:
  108.  
  109. 56.  In BASM, "dw @variable" will not assemble properly.  BP and BPC abort,
  110. while TURBO and TPC give a wrong answer.
  111.  
  112.  
  113. --------------------------------
  114.  
  115.   From: John Stephenson
  116.  
  117. > mov Ax, Word ptr @Data;
  118. > which isn't really the correct way to use it
  119.  
  120.  Thats right! Use it with SEG, look up @data in the online help and see
  121. that it says thats the only way to use it..
  122.  
  123. > generates same results i am looking i just expect that TP would give
  124. > me a Syntax error of some kind
  125.  
  126.  Well, I bet C would hang on something like that after compiling it, due
  127. to the lose type checking..
  128.  
  129. > You can not perform a direct Absolute COnstant Far call Address.
  130. > Call $FFFF:0000; for example will not generate what you want but
  131. > will point you to some area of the Data segment!.
  132.  
  133.  (ouch) That is a "small" bug, but, maybe you can't call up a absolute
  134. memory call in assembler.
  135.  
  136.   On another note, I don't know if this is a bug or not, but it doesn't
  137. work:
  138. }
  139.  
  140. Procedure T(var thing: word); assembler;
  141. var
  142.  value: word;
  143. asm
  144.   mov value, 1h
  145.   mov word ptr thing, value
  146. end;
  147. {
  148. So you need to use this:
  149. }
  150. Procedure T(var thing: word); assembler;
  151. var value: word; asm mov value, 1h; les di, thing; mov ax, value; stosw; end;
  152. {
  153. So that prompts me to ask "What is word ptr for then?"
  154. }
  155.